/////precompiled////////
#include "precompiled.h"
////////////////////////


#include "svl_TText.h"
using namespace svl;

// TText ///////////////////////////////////////////////////////////////////////

//
void TText::MakeLines(TMem &Mem)
{
  int BPos = 0,Pos = 0;
  char *Ptr = (char*)Mem.Ptr();
  int Size = Mem.Size();

  a.Clear(); while (Pos < Size)
  {
    if (Ptr[Pos] == '\t')
		Ptr[Pos] = ' ';
	if (Ptr[Pos] == '\r')
    {
      TLine *L = new TLine; L->Line.Add(&Ptr[BPos],Pos-BPos);
      a.Add(L,true); Pos++;

      while (Pos < Size)
      {
        if (Ptr[Pos] == '\n') { Pos++;}
        else                  { break;}
      }
      BPos = Pos;
    }
    else if (Pos + 1 == Size)
    {
      TLine *L = new TLine; L->Line.Add(&Ptr[BPos],Pos-BPos+1);
      a.Add(L,true); Pos++;
    }
    else { Pos++;}
  }
}

//
bool TText::LoadFromFile(TString FileName) 
{ 
  TMem M; 

  if (M.LoadFromFile(FileName)) {
    MakeLines(M);
    return true;
  }

  return false;
}

//
bool TText::SaveToFile(TString FileName)
{
  TMem Mem; 
  
  for (int N = 0; N < CountLines(); N++) {
    TString Line = GetLine(N); 
    Line << "\r\n"; 
    Mem.Add((BYTE*)Line.S(),Line.Len());
  }
  
  return Mem.SaveToFile(FileName);
}

//
void TText::CopyFrom(TText &From)
{
  Clear(); for (int N = 0; N < From.CountLines(); N++)
  {
    AddLine(From.GetLine(N));
  }
}

//
TString TText::GetInfo()
{
  TString S; for (int N = 0; N < CountLines(); N++)
    { S << GetLine(N) << "\r\n"; }
  return S;
}
